package me.android.library.utils.android;

import static com.blankj.utilcode.util.FileIOUtils.writeFileFromString;

import android.content.Context;
import android.os.Build;
import android.os.Environment;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;

import cn.hutool.core.util.ArrayUtil;
import lombok.experimental.UtilityClass;
import lombok.extern.slf4j.Slf4j;
import mylab.utils.common.StringUtil;

@Slf4j
@UtilityClass
public class FileUtil {

    /**
     * 将数据保存到应用的私有内部存储
     *
     * @param fileName 文件名（不含路径）
     * @param data     要保存的字节数据
     * @return 保存成功返回 true，失败返回 false
     */
    public boolean savePrivateFile(String fileName, byte[] data) {
        if (StringUtil.isEmpty(fileName) || ArrayUtil.isEmpty(data)) {
            return false;
        }

        // 打开文件输出流（MODE_PRIVATE 表示文件只能被应用访问）
        try (FileOutputStream fos = ContextUtil.getAppContext().openFileOutput(fileName, Context.MODE_PRIVATE)) {
            // 写入数据
            fos.write(data);
            return true;
        } catch (IOException e) {
            log.warn("保存私有文件异常", e);
            return false;
        }
    }


    /**
     * 写入文本内容到下载目录
     *
     * @param context  上下文
     * @param content  文本内容
     * @param fileName 文件名（如 "log.txt"）
     * @return 是否写入成功
     */
    public boolean writeToDownload(Context context, String content, String fileName) {
        if (context == null || content == null || fileName.isEmpty()) {
            return false;
        }

        try {
            File targetFile;

            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
                // Android 10+：使用公共下载目录（通过 MediaStore 兼容，无需权限）
                // 注意：UtilCodeX 会自动处理分区存储适配
                targetFile = new File(
                        Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS),
                        fileName
                );
            } else {
                // Android 9 及以下：需申请 WRITE_EXTERNAL_STORAGE 权限
                if (!StorageUtil.isExternalStorageWritable()) {
                    return false;
                }
                // 公共下载目录
                targetFile = new File(
                        Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS),
                        fileName
                );
            }

            // 使用 UtilCodeX 的 FileUtils 写入文本
            return writeFileFromString(targetFile, content, false);

        } catch (Exception e) {
            log.error("writeToDownload error", e);
            return false;
        }
    }

    /**
     * 写入文本到应用私有下载目录（无需权限，推荐用于应用内文件）
     *
     * @param context  上下文
     * @param content  文本内容
     * @param fileName 文件名
     * @return 是否成功
     */
    public boolean writeToPrivateDownload(Context context, String content, String fileName) {
        // 应用私有下载目录：/Android/data/包名/files/Download/
        File privateDownloadDir = ensurePrivateDownloadDir(context);
        File targetFile = new File(privateDownloadDir, fileName);
        return writeFileFromString(targetFile, content, false);
    }

    /**
     * 获取应用私有下载目录的绝对路径
     * 格式：/Android/data/<包名>/files/Download/
     */
    public String getPrivateDownloadPath(Context context) {
        File downloadDir = context.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS);
        assert downloadDir != null;
        return downloadDir.getAbsolutePath(); // 例如：/storage/emulated/0/Android/data/com.example.myapp/files/Download
    }

    /**
     * 检查私有下载目录是否存在，不存在则创建
     */
    public File ensurePrivateDownloadDir(Context context) {
        File dir = context.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS);
        assert dir != null;
        if (!dir.exists()) {
            dir.mkdirs();
        }
        return dir;
    }
}